#ifndef __INTERRUPT_H_
#define __INTERRUPT_H_

#include <type.h>
#include <compiler.h>

#define PIC_M_CTRL 0x20	       // 这里用的可编程中断控制器是8259A,主片的控制端口是0x20
#define PIC_M_DATA 0x21	       // 主片的数据端口是0x21
#define PIC_S_CTRL 0xa0	       // 从片的控制端口是0xa0
#define PIC_S_DATA 0xa1	       // 从片的数据端口是0xa1
#define IDT_DESC_CNT 0x81      // 目前总共支持的中断数

#define ISR(iv) void __isr##iv();

typedef struct {
    u8 CF : 1;  // Carry Flag
    u8 one: 1;  // 1
    u8 PF : 1;  // Parity Flag
    u8 zero: 1;  // 0
    u8 AF : 1;  // Adjust Flag
    u8 zero1: 1;  // 0
    u8 ZF : 1;  // Zero Flag
    u8 SF : 1;  // Sign Flag
    u8 TF : 1;  // Trap Flag
    u8 IF : 1;  // Interrupt Enable Flag
    u8 DF : 1;  // Direction Flag
    u8 OF : 1;  // Overflow Flag
    u8 IOPL : 2;  // I/O Privilege Level
    u8 NT : 1;  // Nested Task
    u8 zero2: 1;  // 0
    u8 RF : 1;  // Resume Flag
    u8 VM : 1;  // Virtual 8086 Mode
    u8 AC : 1;  // Alignment Check / Access Control
    u8 VIF : 1;  // Virtual Interrupt Flag
    u8 VIP : 1;  // Virtual Interrupt Pending
    u8 ID : 1;  // ID Flag
    u16 reserved : 10; // 0
} packed eflags_t;

typedef struct {
    u32 eip;        /*     56      |       4 */
    u32 cs;         /*     60      |       4 */
    union {         /*     64      |       4 */
        u32 val;
        eflags_t flags;
    } eflags;
    u32 esp0;       /*     68      |       4 */
    u32 ss0;        /*     72      |       4 */
} return_ctx;

typedef struct {
    u32 vector;     /*     48      |       4 */
    u32 err_code;   /*     52      |       4 */
    return_ctx ctx; /*     56      |      20 */
} enter_ctx;

// 76bytes
typedef struct {
    u32 eax;        /*      0      |       4 */
    u32 ebx;        /*      4      |       4 */
    u32 ecx;        /*      8      |       4 */
    u32 edx;        /*     12      |       4 */
    u32 esi;        /*     16      |       4 */
    u32 edi;        /*     20      |       4 */
    u32 ebp;        /*     24      |       4 */
    u32 ds;         /*     28      |       4 */
    u32 es;         /*     32      |       4 */
    u32 fs;         /*     36      |       4 */
    u32 gs;         /*     40      |       4 */
    union {
        u32 esp;    /*     44      |       4 */
        enter_ctx* ctx;
    };
} isr_param;

typedef void (*isr)(const isr_param *);

void init_interrupts();

void intr_register_isr(const u8 vector, isr);

void intr_delete_isr(const u8 vector, isr);

#ifdef __DEC_ISR
ISR(0)
ISR(1)
ISR(2)
ISR(3)
ISR(4)
ISR(5)
ISR(6)
ISR(7)
ISR(8)
ISR(9)
ISR(10)
ISR(11)
ISR(12)
ISR(13)
ISR(14)
ISR(15)
ISR(16)
ISR(17)
ISR(18)
ISR(19)
ISR(20)
ISR(21)
ISR(22)
ISR(23)
ISR(24)
ISR(25)
ISR(26)
ISR(27)
ISR(28)
ISR(29)
ISR(30)
ISR(31)
ISR(32)
ISR(33)
ISR(34)
ISR(35)
ISR(36)
ISR(37)
ISR(38)
ISR(39)
ISR(40)
ISR(41)
ISR(42)
ISR(43)
ISR(44)
ISR(45)
ISR(46)
ISR(47)
ISR(48)
ISR(49)
ISR(50)
ISR(51)
ISR(52)
ISR(53)
ISR(54)
ISR(55)
ISR(56)
ISR(57)
ISR(58)
ISR(59)
ISR(60)
ISR(61)
ISR(62)
ISR(63)
ISR(64)
ISR(65)
ISR(66)
ISR(67)
ISR(68)
ISR(69)
ISR(70)
ISR(71)
ISR(72)
ISR(73)
ISR(74)
ISR(75)
ISR(76)
ISR(77)
ISR(78)
ISR(79)
ISR(80)
ISR(81)
ISR(82)
ISR(83)
ISR(84)
ISR(85)
ISR(86)
ISR(87)
ISR(88)
ISR(89)
ISR(90)
ISR(91)
ISR(92)
ISR(93)
ISR(94)
ISR(95)
ISR(96)
ISR(97)
ISR(98)
ISR(99)
ISR(100)
ISR(101)
ISR(102)
ISR(103)
ISR(104)
ISR(105)
ISR(106)
ISR(107)
ISR(108)
ISR(109)
ISR(110)
ISR(111)
ISR(112)
ISR(113)
ISR(114)
ISR(115)
ISR(116)
ISR(117)
ISR(118)
ISR(119)
ISR(120)
ISR(121)
ISR(122)
ISR(123)
ISR(124)
ISR(125)
ISR(126)
ISR(127)
ISR(128)
ISR(129)
ISR(130)
ISR(131)
ISR(132)
ISR(133)
ISR(134)
ISR(135)
ISR(136)
ISR(137)
ISR(138)
ISR(139)
ISR(140)
ISR(141)
ISR(142)
ISR(143)
ISR(144)
ISR(145)
ISR(146)
ISR(147)
ISR(148)
ISR(149)
ISR(150)
ISR(151)
ISR(152)
ISR(153)
ISR(154)
ISR(155)
ISR(156)
ISR(157)
ISR(158)
ISR(159)
ISR(160)
ISR(161)
ISR(162)
ISR(163)
ISR(164)
ISR(165)
ISR(166)
ISR(167)
ISR(168)
ISR(169)
ISR(170)
ISR(171)
ISR(172)
ISR(173)
ISR(174)
ISR(175)
ISR(176)
ISR(177)
ISR(178)
ISR(179)
ISR(180)
ISR(181)
ISR(182)
ISR(183)
ISR(184)
ISR(185)
ISR(186)
ISR(187)
ISR(188)
ISR(189)
ISR(190)
ISR(191)
ISR(192)
ISR(193)
ISR(194)
ISR(195)
ISR(196)
ISR(197)
ISR(198)
ISR(199)
ISR(200)
ISR(201)
ISR(202)
ISR(203)
ISR(204)
ISR(205)
ISR(206)
ISR(207)
ISR(208)
ISR(209)
ISR(210)
ISR(211)
ISR(212)
ISR(213)
ISR(214)
ISR(215)
ISR(216)
ISR(217)
ISR(218)
ISR(219)
ISR(220)
ISR(221)
ISR(222)
ISR(223)
ISR(224)
ISR(225)
ISR(226)
ISR(227)
ISR(228)
ISR(229)
ISR(230)
ISR(231)
ISR(232)
ISR(233)
ISR(234)
ISR(235)
ISR(236)
ISR(237)
ISR(238)
ISR(239)
ISR(240)
ISR(241)
ISR(242)
ISR(243)
ISR(244)
ISR(245)
ISR(246)
ISR(247)
ISR(248)
ISR(249)
ISR(250)
ISR(251)
ISR(252)
ISR(253)
ISR(254)
ISR(255)
#endif // __DEC_ISR
#endif